#include <bits/stdc++.h>
using namespace std;
template <typename T>
class StackWithMin{
public:
    stack<T> m_data;
    stack<T> m_min;
    void push(const T& value);
    void pop();
    T min() const;
    StackWithMin(stack<T>& d,stack<T>& m);
};
template <typename T>
StackWithMin<T>::StackWithMin(stack<T> &d, stack<T> &m) {
    m_data = d;
    m_min = m;
}
template <typename T>
void StackWithMin<T>::push(const T &value) {
    m_data.push(value);
    if(m_min.size()==0||m_min.top()>value)
        m_min.push(value);
    else
        m_min.push(m_min.top());
}
template <typename T>
void StackWithMin<T>::pop() {
    assert(m_data.size()>0 && m_min.size()>0);
    m_data.pop();
    m_min.pop();
}
template <typename T>
T StackWithMin<T>::min() const {
    assert(m_min.size()>0||m_data.size()>0);
    return m_min.top();
}
int main() {
    stack<int> m_data;
    stack<int> m_min;
    StackWithMin<int> s = StackWithMin<int>(m_data,m_min);
    int a = 3,b = 4,c = 2;
    s.push(a);
    s.push(b);
    s.push(c);
    s.pop();
    cout<<s.min();
    return 0;
}